Syntax20b.Scn.Fnt ParcElems Alloc Syntax24b.Scn.Fnt Syntax10.Scn.Fnt Syntax10b.Scn.Fnt Syntax14b.Scn.Fnt FoldElems (* AMIGA *) MODULE AmigaMathL; (* RD 6.8.1995, updated OJ 30 Apr 96 *) (* Danger: access to t.l1 or t.l2 must only affect adressregs!!! (Compiler-dependent) *) IMPORT SYSTEM, E:=AmigaExec; mathDBBase-, mathDTBase- : E.LibraryPtr; mathDBVersion-, mathDTVersion- : INTEGER; termEntry : E.TermEntry; CONST mathDBName*="mathieeedoubbas.library"; mathDTName*="mathieeedoubtrans.library"; TwoLInts = RECORD l1,l2: LONGINT END; t, u : TwoLInts; PROCEDURE -ReturnD0 04EH,05EH, 04EH,075H; PROCEDURE Short*(a: LONGREAL; VAR b: REAL); BEGIN t:=SYSTEM.VAL(TwoLInts, a); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -102, mathDTBase ); SYSTEM.GETREG( 0, b ) END Short; PROCEDURE Long*(a: REAL; VAR b: LONGREAL); BEGIN SYSTEM.PUTREG( 0, a ); SYSTEM.CALL( -108, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); b:=SYSTEM.VAL(LONGREAL, t) END Long; PROCEDURE Entier*(s: LONGREAL): LONGINT; BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -90, mathDBBase ); SYSTEM.CALL( -30, mathDBBase ); ReturnD0 END Entier; PROCEDURE IntToReal*(l: LONGINT; VAR d: LONGREAL); BEGIN SYSTEM.PUTREG( 0, l ); SYSTEM.CALL( -36, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END IntToReal; PROCEDURE Cmp*(s1, s2: LONGREAL): LONGINT; (* 1 if s1>s2 0 if s1=s2 -1 if s10 0 if s=0 -1 if s<0 *) BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -48, mathDBBase ); ReturnD0 END Tst; PROCEDURE Abs*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -54, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Abs; PROCEDURE Neg*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -60, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Neg; PROCEDURE Add*(s1, s2: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 ); SYSTEM.CALL( -66, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Add; PROCEDURE Sub*(s1, s2: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 ); SYSTEM.CALL( -72, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Sub; PROCEDURE Mul*(s1, s2: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 ); SYSTEM.CALL( -78, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Mul; PROCEDURE Div*(s1, s2: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s1); u:=SYSTEM.VAL(TwoLInts, s2); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.PUTREG( 2, u.l1 ); SYSTEM.PUTREG( 3,u.l2 ); SYSTEM.CALL( -84, mathDBBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Div; (*---------------------------------------------------*) PROCEDURE Arctan*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -30, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Arctan; PROCEDURE Sin*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -36, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Sin; PROCEDURE Cos*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -42, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Cos; PROCEDURE Exp*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -78, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Exp; PROCEDURE Ln*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -84, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Ln; PROCEDURE Sqrt*(s: LONGREAL; VAR d: LONGREAL); BEGIN t:=SYSTEM.VAL(TwoLInts, s); SYSTEM.PUTREG( 0, t.l1 ); SYSTEM.PUTREG( 1, t.l2 ); SYSTEM.CALL( -96, mathDTBase ); SYSTEM.GETREG( 0, t.l1 ); SYSTEM.GETREG( 1, t.l2 ); d:=SYSTEM.VAL(LONGREAL, t) END Sqrt; PROCEDURE Ratio*(s1, s2: LONGINT; VAR d: LONGREAL); (* returns s1/s2 *) VAR r1,r2: LONGREAL; BEGIN IntToReal(s1, r1); IntToReal(s2,r2); Div(r1,r2,d) END Ratio; PROCEDURE e*(VAR d: LONGREAL); BEGIN t.l1:=04005BF0AH; t.l2:=08B14575DH; d:=SYSTEM.VAL(LONGREAL, t) END e; PROCEDURE pi*(VAR d: LONGREAL); BEGIN t.l1:=0400921FBH; t.l2:=054442D10H; d:=SYSTEM.VAL(LONGREAL, t) END pi; PROCEDURE Init; TYPE LibraryPtr=POINTER TO E.Library; VAR lib:LibraryPtr; BEGIN mathDBBase:=E.OpenLibrary(mathDBName,37); IF mathDBBase=0 THEN HALT(99) END; lib:=SYSTEM.VAL(LibraryPtr,mathDBBase); mathDBVersion:=lib.version; mathDTBase:=E.OpenLibrary(mathDTName,37); IF mathDTBase=0 THEN HALT(99) END; lib:=SYSTEM.VAL(LibraryPtr,mathDTBase); mathDTVersion:=lib.version END Init; PROCEDURE Term; BEGIN E.CloseLibrary( mathDTBase ); E.CloseLibrary( mathDBBase ) END Term; BEGIN Init; E.Register(termEntry, Term); END AmigaMathL.